
#include "TabEnnemis.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <math.h>


void initTabEnnemis (TabEnnemis* ptab_ennemi)
{
	assert (ptab_ennemi!=NULL);
	ptab_ennemi->ptab_ennemis=NULL;
	ptab_ennemi->nbre_ennemis=0;
}

TabEnnemis* creerTabEnnemis ()
{
	TabEnnemis* ptab_ennemi = (TabEnnemis*) malloc(sizeof(TabEnnemis));
	initTabEnnemis(ptab_ennemi);
	return ptab_ennemi;
}

void libereTabEnnemis (TabEnnemis* ptab_ennemi)
{
	assert (ptab_ennemi!=NULL);
	while (ptab_ennemi->nbre_ennemis > 0)
	{
		detruireEnnemi(&(ptab_ennemi->ptab_ennemis[ptab_ennemi->nbre_ennemis-1]));
		ptab_ennemi->nbre_ennemis--;
	}
}

void detruireTabEnnemis (TabEnnemis** pptab_ennemi)
{
	assert (pptab_ennemi!=NULL && *pptab_ennemi!=NULL);
	libereTabEnnemis (*pptab_ennemi);
	free (*pptab_ennemi);
	*pptab_ennemi=NULL;
}

  
void ajouterEnnemi (TabEnnemis* ptab_ennemi, Ennemi* pennemi)
{ 
	assert (ptab_ennemi!=NULL && pennemi!=NULL);
	if (ptab_ennemi->ptab_ennemis==NULL)
	{
		ptab_ennemi->ptab_ennemis=(Ennemi**)malloc(sizeof(pennemi));
		ptab_ennemi->ptab_ennemis[0]=pennemi;
		ptab_ennemi->nbre_ennemis=1;
	}
	else
	{
		TabEnnemis* ptab_ennemi_temp=creerTabEnnemis ();
 
		ptab_ennemi_temp->ptab_ennemis=(Ennemi**)malloc(sizeof(pennemi)*(ptab_ennemi->nbre_ennemis+1));
		int i;
		for (i=0;i<ptab_ennemi->nbre_ennemis;i++)
			ptab_ennemi_temp->ptab_ennemis[i]=ptab_ennemi->ptab_ennemis[i];
		ptab_ennemi_temp->ptab_ennemis[i]=pennemi;
		ptab_ennemi->nbre_ennemis++;
		free (ptab_ennemi->ptab_ennemis);		//on se contente de free pour garder le nbre d'ennemis.
		ptab_ennemi->ptab_ennemis=ptab_ennemi_temp->ptab_ennemis;
	}
}

void supprimerEnnemi (TabEnnemis* ptab_pennemis, Ennemi* pennemi)
{
	int i;
	
	if (ptab_pennemis->nbre_ennemis>1)
	{
		for (i=0;i<ptab_pennemis->nbre_ennemis;i++)
		{
			if (ptab_pennemis->ptab_ennemis[i]==pennemi)
			{
				detruireEnnemi(&(ptab_pennemis->ptab_ennemis[i]));
				ptab_pennemis->ptab_ennemis[i]=ptab_pennemis->ptab_ennemis[ptab_pennemis->nbre_ennemis-1];
				ptab_pennemis->nbre_ennemis--;
			}
		}
	}
	else if (ptab_pennemis->nbre_ennemis==1)
	{
		if (ptab_pennemis->ptab_ennemis[0]==pennemi)
		{
			detruireEnnemi(&(ptab_pennemis->ptab_ennemis[0]));
			ptab_pennemis->nbre_ennemis--;
		}
	}
}

/** @brief Cette procedure permet de tester toutes les fonctions du module*/
void testRegressionTabEnnemi ()
{	
	printf("Passons au test de regression du module TabEnnemi\n\n");
	printf("Creation point 1\n");
	Point* ppt1=creerPoint(2, 4);
	Point* ppt2=creerPoint(8, 6);
      
	printf("Passons a la creation d'une trajectoire\n\n");
	Trajectoire* ptraj=creerTrajectoire (ppt1, ppt2, 2.5);
	printf("%p\n\n",ptraj);
      
	printf("Passons a la creation des ennemis\n\n");
      	Ennemi* pennemi=creerEnnemi (0, 2, 2, ptraj);
      	Ennemi* pennemi2=creerEnnemi (0, 3, 3, ptraj);
	Ennemi* pennemi3=creerEnnemi (1, 4, 3, ptraj);
	Ennemi* pennemi4=creerEnnemi (0, 8, 3, ptraj);
      
	printf("Passons a la creation du tableau  d'ennemis\n\n");
	TabEnnemis* ptableau_ennemi=creerTabEnnemis ();
	printf("le tableau d'ennemi a pour adresse %p et l'ennemi %p et le nbre %d\n\n"
				,ptableau_ennemi,pennemi,ptableau_ennemi->nbre_ennemis);
      	
	ajouterEnnemi (ptableau_ennemi, pennemi);
	printf("l'ennemi du tabeau a pour taille 3 et vie 110 verifions %f, %d et %p et %p\n\n",
		ptableau_ennemi->ptab_ennemis[0]->tailleY_ennemi,
		ptableau_ennemi->ptab_ennemis[0]->PV_ennemi,
		ptableau_ennemi->ptab_ennemis[0],pennemi);
      
	ajouterEnnemi (ptableau_ennemi, pennemi2);
	printf("l'ennemi2 du tabeau a pour taille 5 et vie 1100 verifions %f, %d, %d et %p et %p\n\n",
		ptableau_ennemi->ptab_ennemis[1]->tailleX_ennemi,
		ptableau_ennemi->ptab_ennemis[1]->PV_ennemi,
		ptableau_ennemi->nbre_ennemis,
		ptableau_ennemi->ptab_ennemis[1],pennemi2);

	ajouterEnnemi (ptableau_ennemi, pennemi3);
	printf("l'ennemi3 du tabeau a pour taille 6 et vie 11000 verifions %f, %d, %d et %p et %p\n\n",
		ptableau_ennemi->ptab_ennemis[2]->tailleX_ennemi,
		ptableau_ennemi->ptab_ennemis[2]->PV_ennemi,
		ptableau_ennemi->nbre_ennemis,
		ptableau_ennemi->ptab_ennemis[2],pennemi3);
      
	ajouterEnnemi (ptableau_ennemi, pennemi4);
	printf("l'ennemi4 du tabeau a pour taille 11 et vie 110000 verifions %f, %d, %d et %p et %p\n\n",
		ptableau_ennemi->ptab_ennemis[3]->tailleX_ennemi,
		ptableau_ennemi->ptab_ennemis[3]->PV_ennemi,
		ptableau_ennemi->nbre_ennemis,
		ptableau_ennemi->ptab_ennemis[3],pennemi3);
	printf("taille : %d\n",ptableau_ennemi->nbre_ennemis);
	
	printf("le nombre d'ennemi apres ajout est %d\n\n",ptableau_ennemi->nbre_ennemis);
	
	supprimerEnnemi (ptableau_ennemi, ptableau_ennemi->ptab_ennemis[0]);
	printf("le nbre d'ennemis est %d\n\n",ptableau_ennemi->nbre_ennemis);
	printf("l'ennemi3 du tabeau a pour taille 6 et vie 11000 verifions %f,%d\n\n",
		ptableau_ennemi->ptab_ennemis[2]->tailleX_ennemi,
		ptableau_ennemi->ptab_ennemis[2]->PV_ennemi);
	    
	
	supprimerEnnemi (ptableau_ennemi, ptableau_ennemi->ptab_ennemis[0]);
	printf("le nbre d'ennemis est %d\n\n",ptableau_ennemi->nbre_ennemis);
	printf("l'ennemi4 du tabeau a pour taille 6 et vie 11000 verifions %f,%d\n\n",
		ptableau_ennemi->ptab_ennemis[1]->tailleX_ennemi,
		ptableau_ennemi->ptab_ennemis[1]->PV_ennemi);
	    
	supprimerEnnemi (ptableau_ennemi, ptableau_ennemi->ptab_ennemis[0]);
	printf("le nbre d'ennemis est  %d\n\n",ptableau_ennemi->nbre_ennemis);
	printf("l'ennemi4 du tabeau a pour taille 3 et vie 110 verifions %f,%d\n\n",
		ptableau_ennemi->ptab_ennemis[0]->tailleX_ennemi,
		ptableau_ennemi->ptab_ennemis[0]->PV_ennemi);
	    
    
	supprimerEnnemi (ptableau_ennemi, ptableau_ennemi->ptab_ennemis[0]);
	printf("le nbre d'ennemis est %d\n\n",ptableau_ennemi->nbre_ennemis);
	
	printf("Fin du test de regression du module TabEnnemi\n\n");     
}
      
